home *** CD-ROM | disk | FTP | other *** search
/ Merciful 2 / Merciful - Disc 2.iso / software / m / muiv3.1cracked.lha / MUI / Developer / Modula / txt / MuiClasses.mod < prev    next >
Text File  |  1995-11-18  |  9KB  |  346 lines

  1. IMPLEMENTATION MODULE MuiClasses;
  2.  
  3. (***************************************************************************
  4. **
  5. ** $VER: MuiClasses.mod 3.1 (18.11.95)
  6. **
  7. ** The following updates have been done by
  8. **
  9. **   Olaf "Olf" Peters <olf@informatik.uni-bremen.de>
  10. **
  11. ** $HISTORY:
  12. **
  13. ** 18.11.95  3.1   : updated for MUI v3.1 release
  14. **
  15. ***************************************************************************)
  16.  
  17. (*************************************************************************
  18. ** Structures and Macros for creating MUI custom classes.
  19. **
  20. ** converted for M2 by Christian 'Kochtopf' Scholz
  21. **
  22. **************************************************************************
  23. **
  24. ** $Id: MuiClasses.mod 1.4 1995/11/18 16:46:18 olf Exp olf $
  25. **
  26. **************************************************************************)
  27.  
  28. FROM    SYSTEM      IMPORT CAST, ADR, BYTE, ADDRESS, REG, SETREG, ASSEMBLE;
  29. FROM    MuiMacros   IMPORT APTR;
  30. FROM    IntuitionD  IMPORT ObjectPtr, WindowPtr, ScreenPtr, DrawInfoPtr, IBox,
  31.                            IntuiMessagePtr, IClassPtr, IClass;
  32. FROM    GraphicsD   IMPORT TextFontPtr, RastPortPtr;
  33. FROM    ExecD       IMPORT MinNode;
  34. FROM    UtilityD    IMPORT Hook, HookPtr;
  35. IMPORT R;
  36.  
  37. (*
  38. ** first some general BOOPSI-things, which aren't defined in the normal defs.
  39. *)
  40.  
  41. TYPE    object = RECORD
  42.                     oNode   : MinNode;
  43.                     oClass  : IClassPtr;
  44.                  END;
  45.  
  46. (* get a pointer to our instance data *)
  47.  
  48. PROCEDURE InstData(cl : IClassPtr; obj : ObjectPtr) : ADDRESS;
  49.     BEGIN
  50.         RETURN (CAST(ADDRESS, obj) + ADDRESS(cl^.instOffset));
  51.     END InstData;
  52.  
  53. (* get the size ... *)
  54.  
  55. PROCEDURE InstSize(cl : IClassPtr) : CARDINAL;
  56.     BEGIN
  57.         RETURN cl^.instOffset+cl^.instSize+SIZE(object);
  58.     END InstSize;
  59.  
  60.  
  61. (* 
  62. ** something, which we can cast your object-pointer to
  63. ** (just used iternally)
  64. *)
  65.  
  66. TYPE    dummyXFC = RECORD
  67.                     mnd : mNotifyData;
  68.                     mad : mAreaData;
  69.                    END;
  70.  
  71.         dummyXFCPtr = POINTER TO dummyXFC;
  72.  
  73.  
  74. (*
  75. ** now the functions to get to some types of data of our object.
  76. *)
  77.  
  78. PROCEDURE muiPen(pen : LONGCARD) : LONGCARD;
  79. VAR
  80.   ret{R.D4} : LONGCARD;
  81. BEGIN
  82.     ASSEMBLE(
  83.       MOVE.L pen(A5), D4
  84.       AND.L  #muipenMask, D4
  85.     END) ;
  86.     RETURN ret ;
  87. END muiPen ;
  88.  
  89. PROCEDURE muiNotifyData(obj : APTR) : mNotifyDataPtr;
  90.     BEGIN
  91.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mnd);
  92.     END muiNotifyData;
  93.  
  94. PROCEDURE muiAreaData(obj : APTR) : mAreaDataPtr;
  95.     BEGIN
  96.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mad);
  97.     END muiAreaData;
  98.  
  99. PROCEDURE muiGlobalInfo(obj : APTR) : mGlobalInfoPtr;
  100.     BEGIN
  101.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndGlobalInfo;
  102.     END muiGlobalInfo;
  103.  
  104. PROCEDURE muiUserData(obj : APTR) : ADDRESS ;
  105.     BEGIN
  106.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndUserData;
  107.     END muiUserData;
  108.  
  109. PROCEDURE muiRenderInfo(obj : APTR) : mRenderInfoPtr;
  110.     BEGIN
  111.         RETURN CAST(dummyXFCPtr, obj)^.mad.madRenderInfo;
  112.     END muiRenderInfo;
  113.  
  114.  
  115. (*
  116. ** here the macros from mui.h.
  117. ** use them to get e.g. your rastport.
  118. *)
  119.  
  120. PROCEDURE OBJ_app(obj : APTR) : ObjectPtr;
  121.     BEGIN
  122.         RETURN muiGlobalInfo(obj)^.mgiApplicationObject;
  123.     END OBJ_app;
  124.  
  125. PROCEDURE OBJ_win(obj : APTR) : ObjectPtr;
  126.     BEGIN
  127.         RETURN muiRenderInfo(obj)^.mriWindowObject;
  128.     END OBJ_win;
  129.  
  130. PROCEDURE OBJ_dri(obj : APTR) : DrawInfoPtr;
  131.     BEGIN
  132.         RETURN muiRenderInfo(obj)^.mriDrawInfo;
  133.     END OBJ_dri;
  134.  
  135. PROCEDURE OBJ_screen(obj : APTR) : ScreenPtr;
  136.     BEGIN
  137.         RETURN muiRenderInfo(obj)^.mriScreen;
  138.     END OBJ_screen;
  139.  
  140. PROCEDURE OBJ_pens(obj : APTR) : WORDPtr;
  141.     BEGIN
  142.         RETURN muiRenderInfo(obj)^.mriPens;
  143.     END OBJ_pens;
  144.  
  145. PROCEDURE OBJ_window(obj : APTR) : WindowPtr;
  146.     BEGIN
  147.         RETURN muiRenderInfo(obj)^.mriWindow;
  148.     END OBJ_window;
  149.  
  150. PROCEDURE OBJ_rp(obj : APTR) : RastPortPtr;
  151.     BEGIN
  152.         RETURN muiRenderInfo(obj)^.mriRastPort;
  153.     END OBJ_rp;
  154.  
  155. PROCEDURE OBJ_left(obj : APTR) : INTEGER;
  156.     BEGIN
  157.         RETURN muiAreaData(obj)^.madBox.left;
  158.     END OBJ_left;
  159.  
  160. PROCEDURE OBJ_top(obj : APTR) : INTEGER;
  161.     BEGIN
  162.         RETURN muiAreaData(obj)^.madBox.top;
  163.     END OBJ_top;
  164.  
  165. PROCEDURE OBJ_width(obj : APTR) : INTEGER;
  166.     BEGIN
  167.         RETURN muiAreaData(obj)^.madBox.width;
  168.     END OBJ_width;
  169.  
  170. PROCEDURE OBJ_height(obj : APTR) : INTEGER;
  171.     BEGIN
  172.         RETURN muiAreaData(obj)^.madBox.height;
  173.     END OBJ_height;
  174.  
  175. PROCEDURE OBJ_right(obj : APTR) : INTEGER;
  176.     BEGIN
  177.         RETURN OBJ_left(obj)+OBJ_width(obj)-1;
  178.     END OBJ_right;
  179.  
  180. PROCEDURE OBJ_bottom(obj : APTR) : INTEGER;
  181.     BEGIN
  182.         RETURN OBJ_top(obj)+OBJ_height(obj)-1;
  183.     END OBJ_bottom;
  184.  
  185. PROCEDURE OBJ_addleft(obj : APTR) : INTEGER;
  186.     BEGIN
  187.         RETURN INTEGER(muiAreaData(obj)^.madAddLeft);
  188.     END OBJ_addleft;
  189.  
  190. PROCEDURE OBJ_addtop(obj : APTR) : INTEGER;
  191.     BEGIN
  192.         RETURN INTEGER(muiAreaData(obj)^.madAddTop);
  193.     END OBJ_addtop;
  194.  
  195. PROCEDURE OBJ_subwidth(obj : APTR) : INTEGER;
  196.     BEGIN
  197.         RETURN INTEGER(muiAreaData(obj)^.madSubWidth);
  198.     END OBJ_subwidth;
  199.  
  200. PROCEDURE OBJ_subheight(obj : APTR) : INTEGER;
  201.     BEGIN
  202.         RETURN INTEGER(muiAreaData(obj)^.madSubHeight);
  203.     END OBJ_subheight;
  204.  
  205. PROCEDURE OBJ_mleft(obj : APTR) : INTEGER;
  206.     BEGIN
  207.         RETURN OBJ_left(obj)+OBJ_addleft(obj);
  208.     END OBJ_mleft;
  209.  
  210. PROCEDURE OBJ_mtop(obj : APTR) : INTEGER;
  211.     BEGIN
  212.         RETURN OBJ_top(obj)+OBJ_addtop(obj);
  213.     END OBJ_mtop;
  214.  
  215. PROCEDURE OBJ_mwidth(obj : APTR) : INTEGER;
  216.     BEGIN
  217.         RETURN OBJ_width(obj)-OBJ_subwidth(obj);
  218.     END OBJ_mwidth;
  219.  
  220. PROCEDURE OBJ_mheight(obj : APTR) : INTEGER;
  221.     BEGIN
  222.         RETURN OBJ_height(obj)-OBJ_subheight(obj);
  223.     END OBJ_mheight;
  224.  
  225. PROCEDURE OBJ_mright(obj : APTR) : INTEGER;
  226.     BEGIN
  227.         RETURN OBJ_mleft(obj)+OBJ_mwidth(obj)-1;
  228.     END OBJ_mright;
  229.  
  230. PROCEDURE OBJ_mbottom(obj : APTR) : INTEGER;
  231.     BEGIN
  232.         RETURN OBJ_mtop(obj)+OBJ_mheight(obj)-1;
  233.     END OBJ_mbottom;
  234.  
  235. PROCEDURE OBJ_font(obj : APTR) : TextFontPtr;
  236.     BEGIN
  237.         RETURN muiAreaData(obj)^.madFont;
  238.     END OBJ_font;
  239.  
  240. PROCEDURE OBJ_minwidth(obj : APTR) : CARDINAL;
  241.     BEGIN
  242.         RETURN muiAreaData(obj)^.madMinMax.MinWidth;
  243.     END OBJ_minwidth;
  244.  
  245. PROCEDURE OBJ_minheight(obj : APTR) : CARDINAL;
  246.     BEGIN
  247.         RETURN muiAreaData(obj)^.madMinMax.MinHeight;
  248.     END OBJ_minheight;
  249.  
  250. PROCEDURE OBJ_maxwidth(obj : APTR) : CARDINAL;
  251.     BEGIN
  252.         RETURN muiAreaData(obj)^.madMinMax.MaxWidth;
  253.     END OBJ_maxwidth;
  254.  
  255. PROCEDURE OBJ_maxheight(obj : APTR) : CARDINAL;
  256.     BEGIN
  257.         RETURN muiAreaData(obj)^.madMinMax.MaxHeight;
  258.     END OBJ_maxheight;
  259.  
  260. PROCEDURE OBJ_defwidth(obj : APTR) : CARDINAL;
  261.     BEGIN
  262.         RETURN muiAreaData(obj)^.madMinMax.DefWidth;
  263.     END OBJ_defwidth;
  264.  
  265. PROCEDURE OBJ_defheight(obj : APTR) : CARDINAL;
  266.     BEGIN
  267.         RETURN muiAreaData(obj)^.madMinMax.DefHeight;
  268.     END OBJ_defheight;
  269.  
  270. PROCEDURE OBJ_flags(obj : APTR) : MADFlagSet;
  271.     BEGIN
  272.         RETURN muiAreaData(obj)^.madFlags;
  273.     END OBJ_flags;
  274.  
  275.  
  276. (*
  277. ** here are some new procedures to generate dispatchers which restore A4
  278. *)
  279.  
  280. (* first the 'real' dispatcher *)
  281.  
  282. PROCEDURE DispatchEntry(class{R.A0} : HookPtr;
  283.                         object{R.A2}: ADDRESS;
  284.                         msg{R.A1}   : ADDRESS)     : ADDRESS;
  285.     (*$SaveA4:=TRUE*)
  286.     BEGIN
  287.         SETREG (R.A4, CAST(IClassPtr,class)^.dispatcher.data);
  288.         RETURN CAST(DispatcherDef,CAST(IClassPtr,class)^.dispatcher.subEntry)(CAST(IClassPtr,class), object, msg);
  289.     END DispatchEntry;
  290.  
  291. (* fill the dispatcher-record inside the class *)
  292.  
  293. PROCEDURE MakeDispatcher(entry:DispatcherDef; VAR myclass : IClassPtr);
  294.  
  295.     BEGIN
  296.             myclass^.dispatcher.node.succ  := NIL;
  297.             myclass^.dispatcher.node.pred  := NIL;
  298.             myclass^.dispatcher.entry      := DispatchEntry;
  299.             myclass^.dispatcher.subEntry   := CAST(ADDRESS,entry);
  300.             myclass^.dispatcher.data       := REG(R.A4);
  301.     END MakeDispatcher;
  302.  
  303.  
  304.  
  305. (* a useful PROCEDURE! *)
  306.  
  307. PROCEDURE FillMinMaxInfo (msg : mpAskMinMaxPtr; MinWidth   : CARDINAL;
  308.                                                 DefWidth   : CARDINAL;
  309.                                                 MaxWidth   : CARDINAL;
  310.                                                 MinHeight  : CARDINAL;
  311.                                                 DefHeight  : CARDINAL;
  312.                                                 MaxHeight  : CARDINAL);
  313.     BEGIN                                               
  314.  
  315.         msg^.MinMaxInfo^.MinWidth  := msg^.MinMaxInfo^.MinWidth +MinWidth;
  316.         msg^.MinMaxInfo^.DefWidth  := msg^.MinMaxInfo^.DefWidth +DefWidth;
  317.         msg^.MinMaxInfo^.MaxWidth  := msg^.MinMaxInfo^.MaxWidth +MaxWidth;
  318.  
  319.         msg^.MinMaxInfo^.MinHeight := msg^.MinMaxInfo^.MinHeight +MinHeight;
  320.         msg^.MinMaxInfo^.DefHeight := msg^.MinMaxInfo^.DefHeight +DefHeight;
  321.         msg^.MinMaxInfo^.MaxHeight := msg^.MinMaxInfo^.MaxHeight +MaxHeight;
  322.  
  323.     END FillMinMaxInfo;
  324.  
  325. (*
  326. ** 2 useful procedures for testing if some coordinates are inside your object
  327. ** (converted from the ones in class3.c. So look there how to use... )
  328. *)
  329.  
  330. PROCEDURE OBJ_between(a,x,b : INTEGER) : BOOLEAN;
  331.     BEGIN
  332.         RETURN ((x>=a) AND (x<=b));
  333.     END OBJ_between;
  334.  
  335. PROCEDURE OBJ_isInObject(x, y : INTEGER; obj : ObjectPtr) : BOOLEAN;
  336.     BEGIN
  337.         RETURN (OBJ_between(OBJ_mleft(obj), x, OBJ_mright(obj)) AND
  338.                 OBJ_between(OBJ_mtop(obj), y, OBJ_mbottom(obj)));
  339.     END OBJ_isInObject;
  340.  
  341.  
  342.  
  343.  
  344. END MuiClasses.
  345.  
  346.